package com.niepan.common.utils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @author:liuchenyu
 * @data:2023/03/01
 */
public class SplitDateUtils {

    /**
     * 传入两个时间范围，返回这两个时间范围内的所有日期，并保存在一个集合中
     *
     * @param beginTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public static List<String> findEveryDay(String beginTime, String endTime) {
        try {
            //创建一个放所有日期的集合
            List<String> dates = new ArrayList();

            //创建时间解析对象规定解析格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

            //将传入的时间解析成Date类型,相当于格式化
            Date dBegin = sdf.parse(beginTime);
            Date dEnd = sdf.parse(endTime);

            //将格式化后的第一天添加进集合
            dates.add(sdf.format(dBegin));

            //使用本地的时区和区域获取日历
            Calendar calBegin = Calendar.getInstance();

            //传入起始时间将此日历设置为起始日历
            calBegin.setTime(dBegin);

            //判断结束日期前一天是否在起始日历的日期之后
            while (dEnd.after(calBegin.getTime())) {

                //根据日历的规则:月份中的每一天，为起始日历加一天
                calBegin.add(Calendar.DAY_OF_MONTH, 1);

                //得到的每一天就添加进集合
                dates.add(sdf.format(calBegin.getTime()));
                //如果当前的起始日历超过结束日期后,就结束循环
            }
            return dates;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 获取两个日期之间的所有月份 (年月)
     *
     * @param startTime
     * @param endTime
     * @return：list
     */
    public static List<String> getMonthBetweenDate(String startTime, String endTime) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        // 声明保存日期集合
        List<String> list = new ArrayList<>();
        try {
            // 转化成日期类型
            Date startDate = sdf.parse(startTime);
            Date endDate = sdf.parse(endTime);

            //用Calendar 进行日期比较判断
            Calendar calendar = Calendar.getInstance();
            while (startDate.getTime() <= endDate.getTime()) {

                // 把日期添加到集合
                list.add(sdf.format(startDate));

                // 设置日期
                calendar.setTime(startDate);

                //把月数增加 1
                calendar.add(Calendar.MONTH, 1);

                // 获取增加后的日期
                startDate = calendar.getTime();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }


    /**
     * 获取两个日期之间的所有年
     *
     * @param startTime
     * @param endTime
     * @return：list
     */
    public static List<String> getYearBetweenDate(String startTime, String endTime) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        // 声明保存日期集合
        List<String> list = new ArrayList<>();
        try {
            // 转化成日期类型
            Date startDate = sdf.parse(startTime);
            Date endDate = sdf.parse(endTime);

            //用Calendar 进行日期比较判断
            Calendar calendar = Calendar.getInstance();
            while (startDate.getTime() <= endDate.getTime()) {

                // 把日期添加到集合
                list.add(sdf.format(startDate));

                // 设置日期
                calendar.setTime(startDate);

                //把年数增加 1
                calendar.add(Calendar.YEAR, 1);

                // 获取增加后的日期
                startDate = calendar.getTime();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
}
